package leetcode.leetcode3;

import java.util.HashMap;

/**
 * @author czt
 * @version 1.0
 * @since 2025/1/6
 */
public class Leetcode3 {

    /*
    思路:
        1.用begin和end表示子串开始和结束位置
        2.用hash表检查重复字符
        3.从左向右查看每个字符，如果:
            - 没遇到重复字符，调整end
            - 遇到重复的字符，调整begin
            - 将当前字符放入hash表
        4.end - begin + 1 是当前子串长度
     */

    public int lengthOfLongestSubstring(String s) {
        HashMap<Character, Integer> map = new HashMap<>();
        int begin = 0;
        int maxLength = 0;
        for (int end = 0; end < s.length(); end++) {
            // 根据索引找值
            char ch = s.charAt(end);
            if (map.containsKey(ch)) { // 如果有重复的，更新begin，从下一个字符开始算起
                begin = Math.max(begin, map.get(ch) + 1);
                map.put(ch, end);
            } else {
                map.put(ch, end);
            }
            maxLength = Math.max(maxLength, end - begin + 1);
        }
        return maxLength;
    }
}
